package com.objcat.playground.leetcode;

import java.util.ArrayList;

public class Solution20 {

    /**
     * description: removeNthFromEnd <br>
     * version: 1.0 <br>
     * date: 2022/3/13 7:05 下午 <br>
     * author: objcat <br>
     * 执行用时：0 ms, 在所有 Java 提交中击败了 100.00% 的用户
     * 内存消耗：39.3 MB, 在所有 Java 提交中击败了 45.21% 的用户
     * @param head 节点头
     * @param n 删除元素个数
     * @return com.objcat.playground.temp.ListNode
     */
    public ListNode removeNthFromEnd(ListNode head, int n) {

        // 判断边界
        if (n <= 0) {
            return head;
        }

        // 记录链表的总数
        int count = 0;
        // 拷贝一份head用来计算链表长度
        ListNode node2 = head;
        while (true) {
            count++;
            if (node2.next == null) {
                break;
            }
            node2 = node2.next;
        }

        // 判断边界
        if (n > count) {
            return head;
        }

        // 拷贝一份head用来计算要删除的元素
        ListNode node3 = head;
        // 根据不同的位置来使用不同的删除方式
        if (count == 1) {
            // 只有一个的情况删除它自己
            return null;
        } else if (n == 1) {
            // 删除最后一个元素:
            // 1.找到最有一个元素之前的元素
            for (int i = 0; i < count - n - 1; i++) {
                node3 = node3.next;
            }
            // 2.移除它的next
            node3.next = null;
        } else {
            // 除了最后一个 其他的删除方式都相同
            // 找到要删除的元素
            for (int i = 0; i < count - n; i++) {
                node3 = node3.next;
            }
            // 删除
            node3.val = node3.next.val;
            node3.next = node3.next.next;
        }

        return head;
    }

    public static void main(String[] args) {

        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);

        ListNode head = ListNode.createNode(list);
        Solution20 solution20 = new Solution20();
        head = solution20.removeNthFromEnd(head, 1);
    }
}


